﻿using System.IO;

namespace InDepth2Demo.Chapter1314
{
    internal class VarianceDemo
    {

        // 普通继承中的可变性：例如，若某方法声明返回类型为 Stream，在实现时可以返回一个 MemoryStream。
        public Stream TestVariance()
        {
            return new MemoryStream();
        }
    }

    //1. 协变性：从API返回的值
    //协变性用于向调用者返回某项操作的值。
    interface IFactory<T>
    {
        T CreateInstance();                     //T在接口中只出现了一次（除了在签名中），它仅作为返回值使用，即方法的输出。
    }

    //2. 逆变性：传入API的值
    //逆变性则相反。它指的是调用者向API传入值，即API是在消费值，而不是产生值。
    interface IPrettyPrinter<T>
    {
        void Print(T document);                 //这次T只作为参数出现在了接口的输入位置。
    }

    //3. 不变性：双向传递的值
    //下面的接口表示可以对数据类型进行序列化和反序列化的类型：
    interface IStorage<T>
    {
        byte[] Serialize(T value);
        T Deserialize(byte[] data);
    }
    //即如果存在从IStorage<Customer>到IStorage<Person>的隐式转换，那么当Serialize方法的参数为Student这样的非Customer类时，实际的IStorage<Customer>类将无法序列化这个Student。——译者注
    //即如果存在从IStorage<Person>到IStorage<Customer>的隐式转换，那么当Deserialize方法返回Student类时，将无法得到期望的Customer。——译者注
}
